#!/usr/bin/env node

/**
 * 启用所有表脚本
 * 
 * 此脚本用于自动启用配置中的所有表，便于批量生成文档
 * @author Urban Lifeline Team
 */

const fs = require('fs');
const path = require('path');
const chalk = require('chalk');
const ora = require('ora');

// 配置文件路径
const CONFIG_DIR = path.join(__dirname, '../.config');
const TABLE_CONFIG_FILE = path.join(CONFIG_DIR, 'table-config.json');

/**
 * 读取表配置
 * @returns {Object} 表配置对象
 */
function readTableConfig() {
    if (!fs.existsSync(TABLE_CONFIG_FILE)) {
        console.error(chalk.red('错误: 找不到表配置文件'));
        console.log(chalk.yellow('提示: 请先运行 "cli.sh test" 获取表列表'));
        return null;
    }

    try {
        const content = fs.readFileSync(TABLE_CONFIG_FILE, 'utf8');
        return JSON.parse(content);
    } catch (error) {
        console.error(chalk.red('错误: 读取表配置文件失败'), error.message);
        return null;
    }
}

/**
 * 保存表配置
 * @param {Object} config 表配置对象
 * @returns {boolean} 是否保存成功
 */
function saveTableConfig(config) {
    try {
        // 确保目录存在
        if (!fs.existsSync(CONFIG_DIR)) {
            fs.mkdirSync(CONFIG_DIR, { recursive: true });
        }

        fs.writeFileSync(TABLE_CONFIG_FILE, JSON.stringify(config, null, 2), 'utf8');
        return true;
    } catch (error) {
        console.error(chalk.red('错误: 保存表配置文件失败'), error.message);
        return false;
    }
}

/**
 * 启用所有表
 */
function enableAllTables() {
    const spinner = ora('正在读取表配置...').start();

    // 读取配置
    const config = readTableConfig();
    if (!config) {
        spinner.fail(chalk.red('无法读取表配置，操作终止'));
        process.exit(1);
    }

    // 获取表名列表
    const tableNames = Object.keys(config);

    spinner.text = `找到 ${tableNames.length} 个表配置，正在启用所有表...`;

    // 更新所有表的启用状态
    let enabledCount = 0;
    tableNames.forEach(tableName => {
        if (!config[tableName].enabled) {
            config[tableName].enabled = true;
            enabledCount++;
        }
    });

    // 保存更新后的配置
    if (saveTableConfig(config)) {
        spinner.succeed(chalk.green(`成功启用了 ${enabledCount} 个表，总共 ${tableNames.length} 个表`));

        // 显示所有表的列表
        console.log(chalk.blue('\n已启用的表:'));

        // 创建一个表格式输出
        console.log('┌' + '─'.repeat(40) + '┬' + '─'.repeat(15) + '┐');
        console.log('│ ' + chalk.yellow('表名'.padEnd(38)) + ' │ ' +
            chalk.yellow('状态'.padEnd(13)) + ' │');
        console.log('├' + '─'.repeat(40) + '┼' + '─'.repeat(15) + '┤');

        // 显示表列表
        const displayCount = Math.min(tableNames.length, 10);
        for (let i = 0; i < displayCount; i++) {
            const tableName = tableNames[i];
            console.log('│ ' + chalk.cyan(tableName.padEnd(38)) + ' │ ' +
                chalk.green('已启用'.padEnd(13)) + ' │');
        }

        console.log('├' + '─'.repeat(40) + '┼' + '─'.repeat(15) + '┤');
        if (tableNames.length > 10) {
            console.log('│ ' + `... 还有 ${tableNames.length - 10} 个表未显示`.padEnd(56) + ' │');
            console.log('└' + '─'.repeat(40) + '┴' + '─'.repeat(15) + '┘');
        } else {
            console.log('└' + '─'.repeat(40) + '┴' + '─'.repeat(15) + '┘');
        }

        // 显示下一步提示
        console.log(chalk.blue('\n下一步:'));
        console.log('要生成所有表的文档和类型定义，请运行:');
        console.log(chalk.yellow('  ./cli.sh docs'));

        return true;
    } else {
        spinner.fail(chalk.red('保存配置失败，操作终止'));
        return false;
    }
}

// 主函数
function main() {
    console.log(chalk.blue('===== 启用所有表 ====='));

    // 执行启用所有表的操作
    const result = enableAllTables();

    // 根据结果退出
    process.exit(result ? 0 : 1);
}

// 执行主函数
main(); 